package com.njmaomao.gj.pyot.domain.wechat.wechatapi.refund;

import com.njmaomao.gj.pyot.domain.wechat.wechatapi.ApiResp;
import com.thoughtworks.xstream.annotations.XStreamAlias;

import java.util.Optional;

/**
 * 申请退款出参
 * @author hh 2018-5-10
 */
@XStreamAlias("xml")
public class RefundResp implements ApiResp {

    // 返回状态码 必填[是] SUCCESS/FAIL
    @XStreamAlias("return_code")
    private String returnCode;

    // 返回信息 必填[否] 返回信息，如非空，为错误原因
    @XStreamAlias("return_msg")
    private String returnMsg;

    // 业务结果 必填[是] SUCCESS/FAIL SUCCESS退款申请接收成功，结果通过退款查询接口查询 FAIL 提交业务失败
    @XStreamAlias("result_code")
    private String resultCode;

    // 错误代码 必填[否] 列表详见错误码列表
    @XStreamAlias("err_code")
    private String errCode;

    // 错误代码描述 必填[否] 结果信息描述
    @XStreamAlias("err_code_des")
    private String errCodeDes;

    // 公众账号ID 必填[是] 微信分配的公众账号ID
    private String appid;

    // 商户号 必填[是] 微信支付分配的商户号
    @XStreamAlias("mch_id")
    private String mchId;

    // 随机字符串 必填[是] 随机字符串，不长于32位
    @XStreamAlias("nonce_str")
    private String nonceStr;

    // 签名 必填[是] 签名，详见签名算法
    private String sign;

    // 微信订单号 必填[是] 微信订单号
    @XStreamAlias("transaction_id")
    private String transactionId;

    // 商户订单号 必填[是] 商户系统内部订单号，要求32个字符内，只能是数字、大小写字母_-|*@ ，且在同一个商户号下唯一。
    @XStreamAlias("out_trade_no")
    private String outTradeNo;

    // 商户退款单号 必填[是] 商户系统内部的退款单号，商户系统内部唯一，只能是数字、大小写字母_-|*@ ，同一退款单号多次请求只退一笔。
    @XStreamAlias("out_refund_no")
    private String outRefundNo;

    // 微信退款单号 必填[是] 微信退款单号
    @XStreamAlias("refund_id")
    private String refundId;

    // 退款金额 必填[是] 退款总金额,单位为分,可以做部分退款
    @XStreamAlias("refund_fee")
    private int refundFee;

    // 应结退款金额 必填[否] 去掉非充值代金券退款金额后的退款金额，退款金额=申请退款金额-非充值代金券退款金额，退款金额<=申请退款金额
    @XStreamAlias("settlement_refund_fee")
    private int settlementRefundFee;

    // 标价金额 必填[是] 订单总金额，单位为分，只能为整数，详见支付金额
    @XStreamAlias("total_fee")
    private int totalFee;

    // 应结订单金额 必填[否] 去掉非充值代金券金额后的订单总金额，应结订单金额=订单金额-非充值代金券金额，应结订单金额<=订单金额。
    @XStreamAlias("settlement_total_fee")
    private int settlementTotalFee ;

    // 标价币种 必填[否] 订单金额货币类型，符合ISO 4217标准的三位字母代码，默认人民币：CNY，其他值列表详见货币类型
    @XStreamAlias("fee_type")
    private String feeType;

    // 现金支付金额 必填[是] 现金支付金额，单位为分，只能为整数，详见支付金额
    @XStreamAlias("cash_fee")
    private int cashFee;

    // 现金支付币种 必填[否 ] 货币类型，符合ISO 4217标准的三位字母代码，默认人民币：CNY，其他值列表详见货币类型
    @XStreamAlias("cash_fee_type")
    private String cashFeeType ;

    // 现金退款金额 必填[否] 现金退款金额，单位为分，只能为整数，详见支付金额
    @XStreamAlias("cash_refund_fee")
    private int cashRefundFee;

    // 代金券类型 必填[否 ] CASH--充值代金券 NO_CASH---非充值代金券 订单使用代金券时有返回（取值：CASH、NO_CASH）。$n为下标,从0开始编号，举例：coupon_type_0
    @XStreamAlias("coupon_type_$n")
    private String couponType_$n ;

    // 代金券退款总金额 必填[否] 代金券退款金额<=退款金额，退款金额-代金券或立减优惠退款金额为现金，说明详见代金券或立减优惠
    @XStreamAlias("coupon_refund_fee")
    private int couponRefundFee;

    // 单个代金券退款金额 必填[否] 代金券退款金额<=退款金额，退款金额-代金券或立减优惠退款金额为现金，说明详见代金券或立减优惠
    @XStreamAlias("coupon_refund_fee_$n")
    private int couponRefundFee_$n;

    // 退款代金券使用数量 必填[否] 退款代金券使用数量
    @XStreamAlias("coupon_refund_count")
    private int couponRefundCount;

    // 退款代金券ID 必填[否] 退款代金券ID, $n为下标，从0开始编号
    @XStreamAlias("coupon_refund_id_$n")
    private String couponRefundId_$n;

    public String getReturnCode() {
        return returnCode;
    }

    @Override
    public Optional<String> getReturnMsg() {
        return Optional.ofNullable(returnMsg);
    }

    @Override
    public String getResultCode() {
        return resultCode;
    }

    @Override
    public String getErrCode() {
        return errCode;
    }

    @Override
    public String getErrCodeDes() {
        return errCodeDes;
    }

    public String getAppid() {
        return appid;
    }

    public String getMchId() {
        return mchId;
    }

    public String getNonceStr() {
        return nonceStr;
    }

    public String getSign() {
        return sign;
    }

    public String getTransactionId() {
        return transactionId;
    }

    public String getOutTradeNo() {
        return outTradeNo;
    }

    public String getOutRefundNo() {
        return outRefundNo;
    }

    public String getRefundId() {
        return refundId;
    }

    public int getRefundFee() {
        return refundFee;
    }

    public int getSettlementRefundFee() {
        return settlementRefundFee;
    }

    public int getTotalFee() {
        return totalFee;
    }

    public int getSettlementTotalFee() {
        return settlementTotalFee;
    }

    public String getFeeType() {
        return feeType;
    }

    public int getCashFee() {
        return cashFee;
    }

    public String getCashFeeType() {
        return cashFeeType;
    }

    public int getCashRefundFee() {
        return cashRefundFee;
    }

    public String getCouponType_$n() {
        return couponType_$n;
    }

    public int getCouponRefundFee() {
        return couponRefundFee;
    }

    public int getCouponRefundFee_$n() {
        return couponRefundFee_$n;
    }

    public int getCouponRefundCount() {
        return couponRefundCount;
    }

    public String getCouponRefundId_$n() {
        return couponRefundId_$n;
    }
}
